<?php
namespace app\common\model;
use think\Db;
class Order extends Base{
    /**
     * 生成订单号
     * @param  string $prefix 前缀
     * @return [type]         [description]
     */
    function number($prefix=''){
        $number=$prefix.date('YmdHis').rand(1000,9999);
        $has=$this->where(['number'=>$number])->count();
        if($has){
            return $this->number($prefix);
        }
        return $number;
    }

    function tel(){
        return $this->belongsTo('member','pid')->field('id,vip_id,tel')->bind('vip_text,tel');
    }

    // 用户付款成功 给用户增加VIP时间
    function handle($order=[]){
        if($order['type']==1){
            return $this->vipOrderHandle($order);
        }elseif($order['type']==2){
            return $this->coinOrderHandle($order);
        }
        
    }
    /**
     * 虚拟币 订单处理
     * @param  array  $order [description]
     * @return [type]        [description]
     */
    function coinOrderHandle($order=[]){
        $uid=$order['uid'];
        $res=false;
        if($order['ratio']>0){
            $res=model('member')->where(['id'=>$uid])->setInc('coin',$order['ratio']);
            if($res){
                model('coinlog')->add([
                    'uid'=>$uid,
                    'nums'=>$order['ratio'],
                    'time'=>time(),
                    'type'=>1,
                    'remark'=>'购买'.lang('coin'),
                ]);
            }
        }else{
            $res=model('member')->where(['id'=>$uid])->setInc('coin_expire',$order['time']);
            if($res){
                model('coinlog')->add([
                    'uid'=>$uid,
                    'nums'=>'无限量包',
                    'time'=>time(),
                    'type'=>1,
                    'remark'=>'购买'.lang('coin'),
                ]);
            }
        }
        return $res;
    }
    /**
     * Vip 订单处理
     * @param  array  $order [description]
     * @return [type]        [description]
     */
    function vipOrderHandle($order=[]){
        $uid=$order['uid'];
        $level=$order['vip_level'];
        $user=model('member')->read(['id'=>$uid],'id,tel,vip_expire,vip_ratio,vip_level');
        $data=[
            'id'=>$uid,
            'vip_ratio'=>$order['ratio'],
            'vip_level'=>$level,
            'vip_id'=>$order['vid'],
        ];
        if($user['vip_ratio']>$data['vip_ratio']){
            $data['vip_ratio']=$user['vip_ratio'];
        }
        $time=time();
        // 仅购买相同的Vip级数做时间累加 购买更高级的则送优惠卷
        if($user['vip_level']==$level&&$user['vip_expire']>$time){
            $data['vip_expire']=$user['vip_expire']+$order['time'];
        }else{
            $data['vip_expire']=$time+$order['time'];
        }
        $edit=model('member')->edit($data);
        if($edit){
            if($level>0&&$level<$user['vip_level']){ // 赠送优惠卷
                $raw_money=$order['raw_money'];
                $c=model('coupon')->read(['usable'=>$raw_money],'id');
                if(isset($c['id'])){
                    model('coupon')->accept($uid,$c['id'],'buyVip');
                }
            }
            // 设置所有未过期的订单奖励为无过期时间
            $map=[
                'pid'=>$uid,
                'state'=>1,
                'is_gain'=>0,
                'expire_time'=>['expire_time','>',time()],
            ];
            $this->edit(['expire_time'=>0],$map);
            $vip=model('vip')->read(['id'=>$order['vid']],'name');
            $tel=preg_replace('/^(\d{3})\d+(\d{4})$/',"\$1****\$2", $user['tel']);
            model('news')->add([
                'uid'=>$uid,
                'content'=>"恭喜{$tel}成功开通{$vip['name']}",
                's_time'=>time(),
            ]);
            return true;
        }
    }
    function overdueCoupon($cid,$uid){
        return model('memberCoupon')->edit(['status'=>0],['uid'=>$uid,'id'=>$cid]);
    }



    function user(){
        return $this->belongsTo('member','uid')->field('id,name,alipay_realname,weixin_realname')->bind(['user'=>'name','alipay_realname','weixin_realname']);
    }
    function parent(){
        return $this->belongsTo('member','pid')->field('id,tel,alipay_realname,weixin_realname')->bind([
            'ptel'=>'tel',
            'palipay_realname'=>'alipay_realname',
            'pweixin_realname'=>'weixin_realname',
        ]);
    }
    function vip(){
        return $this->belongsTo('vip','vid')->field('id,name,y,m,d')->bind(['vip'=>'name','y','m','d']);
    }
    function coin(){
        return $this->belongsTo('coin','vid')->field('id,name')->bind(['coin'=>'name']);
    }




    /**
     * 订单成功支付后续处理
     * @param  string $order_number 平台订单号
     * @param  string $trade_no     第三方订单号
     * @param  string $cash_fee     用户付款金额
     * @return json
     */
    function orderHandle($order_number,$trade_no,$cash_fee,$remark=null){
        $order=model('order')->read(['number'=>$order_number]);
        if(empty($order)){
            return json('订单不存在',1);
        }
        if(!$order['state']){
            $time=time();
            $parent=model('member')->read(['id'=>$order['pid']],'vip_level');
            $expire_time=$order['expire_time'];
            if(empty($parent)||!$parent['vip_level']){
                $expire_time=$time+7*86400;
            }

            $result=true;
            Db::startTrans();
            try {
                $edit=model('order')->edit([
                    'id'=>$order['id'],
                    'state'=>1,
                    'e_time'=>$time,
                    'expire_time'=>$expire_time,
                    'trade_no'=>$trade_no,
                    'buyer_pay_amount'=>$cash_fee,
                ]);
                if(!$edit){
                    exception('系统繁忙');
                }
                if($order['cid']>0){ //优惠卷过期处理
                    $res=model('order')->overdueCoupon($order['mcid'],$order['uid']);
                    if(!$res){
                        exception('系统繁忙');
                    }
                }
                $res=model('order')->handle($order);
                if(!$res){
                    exception('系统繁忙');
                }
                // 财务记录写入
                $module=model('artmodule')->read(['name'=>'single'],'id');
                if($order['type']==1){ //vip购买
                    if(is_null($remark)){
                        $remark='vip购买';
                    }
                    $f=model('finance')->log($order['uid'],$order['uid'],$order['money'],0,[
                        'remark'=>$remark,
                        'module_id'=>$module['id'],
                        'order_id'=>$order['id'],
                    ]);
                    if(empty($f)){
                        exception('系统繁忙,记录写入失败');
                    }

                    // 代理商
                    $ares=$this->agent($order,$module['id']);
                    if(!$ares){
                        exception('系统繁忙,代理商处理失败');
                    }

                }elseif($order['type']==2){ //虚拟币购买
                    if(is_null($remark)){
                        $remark=lang('coin').'购买';
                    }
                    $f=model('finance')->log($order['uid'],$order['uid'],$order['money'],4,[
                        'remark'=>$remark,
                        'module_id'=>$module['id'],
                        'order_id'=>$order['id'],
                    ]);
                    if(empty($f)){
                        exception('系统繁忙,记录写入失败');
                    }
                    // 代理商
                    $ares=$this->agent($order,$module['id']);
                    if(!$ares){
                        exception('系统繁忙,代理商处理失败');
                    }
                }

                Db::commit();
            } catch (\Exception $e) {
                Db::rollback();
                $result=$e->getMessage();
            }
            if(true!==$result){
                return json($result,1);
            }
            logger('info',lang('user order success',[
                $remark,
                $order_number,
                $trade_no,
                $cash_fee,
            ]));
        }
        return true;
    }
    /**
     * 代理商奖金处理
     * @param  array $order     订单数据
     * @param  integer $module_id 模块ID
     * @return boolean
     */
    function agent($order,$module_id){
        if($order['money']<=0){
            return true;
        }
        $agent_ratio=config('setting.agent_ratio');
        if(isset($agent_ratio)&&$agent_ratio>0&&$order['pid']>0){
            // 后续数据查询代理商
            $parent=[];
            $user=model('member')->read(['id'=>$order['uid']],'p_path');
            if(isset($user['p_path'])&&!empty($user['p_path'])){
                $parent=model('member')->read('is_agent=1 and id in (0'.$user['p_path'].'0)',
                    'id,is_agent',
                    ['order'=>'id desc']
                );
            }
            if(empty($parent)){
                // 兼容之前的数据
                $parent=model('member')->read(['id'=>$order['pid'],'is_agent'=>1],'id,is_agent');
            }

            if(!empty($parent)){
                $agent_money=$order['money']*$agent_ratio/100;
                $agentInc=model('member')->where(['id'=>$parent['id']])->setInc('money',$agent_money);
                if(!$agentInc){
                    return false;
                }
                $f=model('finance')->log($parent['id'],$order['uid'],$agent_money,2,[
                    'remark'=>'代理商奖金',
                    'module_id'=>$module_id,
                    'order_id'=>$order['id'],
                ]);
                if(empty($f)){
                    return false;
                }
            }
        }
        return true;
    }
}
